#include <bits/stdc++.h>

using namespace std;

const double eps=1e-6;
const int maxn=550;

inline int dcmp(const double &d){if(fabs(d)<eps) return 0;return d>0?1:-1;}
inline bool lessthan(const double &x,const double &y){return dcmp(x-y)<=0;}

struct Line{
    double x1,x2,y1,y2;
    inline double getY(const double &x) const{
        //assert(dcmp(x-x1)>=0&&dcmp(x2-x)>=0);
        double k=(y1-y2)/(x1-x2);
        return y1+k*(x-x1);
    }
};

int n,cnt;
double alpha;
Line l[maxn];
double h[maxn],r[maxn],x[maxn];
bool del[maxn];

inline void project(){
    alpha=1/tan(alpha);
    for(int i=0;i<n;i++) x[i]=h[i]*alpha;

    for(int i=0;i<n-1;i++){
        double d=x[i+1]-x[i];
        if(lessthan(r[i],r[i+1])&&lessthan(d,r[i+1]-r[i])) del[i]=1;
        else if(lessthan(r[i+1],r[i])&&lessthan(d,r[i]-r[i+1])) del[i+1]=1;
        else{
            double si,co;
            si=(r[i]-r[i+1])/d;
            co=sqrt(1-si*si);
            l[cnt].x1=x[i]+r[i]*si;l[cnt].x2=x[i+1]+r[i+1]*si;
            l[cnt].y1=r[i]*co;l[cnt].y2=r[i+1]*co;
            cnt++;
        }
    }

    int num=0;
    for(int i=0;i<n;i++) if(!del[i]) x[num]=x[i],r[num++]=r[i];
    n=num;
}
inline double getY(const double &o,const double &r,const double &x){
    double d=fabs(o-x);
    if(dcmp(d-r)<=0) return sqrt(r*r-d*d+eps);
    else return -1;
}
inline int selectLine(const double &x){
    int bg=0,ed=cnt-1;
    while(bg<ed){
        int mid=(bg+ed)>>1;
        mid++;
        if(dcmp(x-l[mid].x1)>=0) bg=mid;
        else ed=mid-1;
    }
    return bg;
}
inline double getHei(const double &px){
    int t;
    double ans;
    /*if(cnt&&dcmp(px-l[0].x1)>=0&&dcmp(l[t=selectLine(px)].x2-px)>=0) ans=l[t].getY(px);
    else ans=0;*/
    ans=0;
    for(int i=0;i<cnt;i++) if(dcmp(px-l[i].x1)>=0&&dcmp(l[i].x2-px)>=0) ans=max(ans,l[i].getY(px));
    /*t=upper_bound(x,x+n,px)-x;
    //printf("t=%d\n",t);
    if(t<n) ans=max(ans,getY(x[t],r[t],px));
    if(t+1<n) ans=max(ans,getY(x[t+1],r[t+1],px));
    if(t-1>=0) ans=max(ans,getY(x[t-1],r[t-1],px));*/
    for(int i=0;i<n;i++) ans=max(ans,getY(x[i],r[i],px));
    return ans;
}

inline double area(const double &a,const double &b){
    double c=(a+b)/2;
    return (c-a)/3*(getHei(a)+getHei(b)+4*getHei(c));
}

bool flag;
double asr(const double &a,const double &b,const double &val){
    //if(!flag) printf("%.4f,%.4f\n",a,b),flag=1;
    double c,l,r;
    c=(a+b)/2;
    l=area(a,c);r=area(c,b);
    if(fabs(l+r-val)<eps) return l+r;
    else return asr(a,c,l)+asr(c,b,r);
}

int main(){
    scanf("%d%lf",&n,&alpha);
    r[n++]=eps;
    for(int i=0;i<n;i++) scanf("%lf",h+i);
    for(int i=0;i<n-1;i++) scanf("%lf",r+i);
    for(int i=1;i<n;i++) h[i]+=h[i-1];
    project();
    /*for(int i=0;i<cnt;i++)
            printf("%.4f %.4f %.4f %.4f\n",l[i].x1,l[i].y1,l[i].x2,l[i].y2);
    //printf("n=%d\n",n);
    for(int i=0;i<n;i++) printf("%.4f,%.4f\n",x[i],r[i]);*/
    printf("%.2f\n",2*asr(x[0]-r[0],x[n-1]+r[n-1],area(x[0]-r[0],x[n-1]+r[n-1])));
    return 0;
}
